#define BLKIF_STATE_DISCONNECTED 0
#define BLKIF_STATE_CONNECTED 1
-static unsigned int blkif_state = BLKIF_STATE_DISCONNECTED;
-
#define MAXIMUM_OUTSTANDING_BLOCK_REQS \
(BLKIF_MAX_SEGMENTS_PER_REQUEST * BLKIF_RING_SIZE)
#define GRANT_INVALID_REF 0
info->connected = BLKIF_STATE_CONNECTED;
xlvbd_add(sectors, info->vdevice, binfo, sector_size, info);
- blkif_state = BLKIF_STATE_CONNECTED;
-
xenbus_dev_ok(info->xbdev);
/* Kick pending requests. */
static void __init init_blk_xenbus(void)
{
- xenbus_register_device(&blkfront);
-}
-
-static int wait_for_blkif(void)
-{
- int err = 0;
- int i;
-
- /*
- * We should figure out how many and which devices we need to
- * proceed and only wait for those. For now, continue once the
- * first device is around.
- */
- for (i = 0; blkif_state != BLKIF_STATE_CONNECTED && (i < 10*HZ); i++) {
- set_current_state(TASK_INTERRUPTIBLE);
- schedule_timeout(1);
- }
-
- if (blkif_state != BLKIF_STATE_CONNECTED) {
- WPRINTK("Timeout connecting to device!\n");
- err = -ENOSYS;
- }
- return err;
+ xenbus_register_driver(&blkfront);
}
static int __init xlblk_init(void)
init_blk_xenbus();
- wait_for_blkif();
-
return 0;
}
gd->first_minor = minor;
gd->fops = &xlvbd_block_fops;
gd->private_data = info;
+ gd->driverfs_dev = &(info->xbdev->dev);
set_capacity(gd, capacity);
if (xlvbd_init_blk_queue(gd, sector_size)) {
#endif
-#define NETIF_STATE_DISCONNECTED 0
-#define NETIF_STATE_CONNECTED 1
-
-static unsigned int netif_state = NETIF_STATE_DISCONNECTED;
-
static void network_tx_buf_gc(struct net_device *dev);
static void network_alloc_rx_buffers(struct net_device *dev);
np->user_state = UST_CLOSED;
np->handle = handle;
np->xbdev = dev;
-
+
spin_lock_init(&np->tx_lock);
spin_lock_init(&np->rx_lock);
netdev->features = NETIF_F_IP_CSUM;
SET_ETHTOOL_OPS(netdev, &network_ethtool_ops);
-
+ SET_MODULE_OWNER(netdev);
+ SET_NETDEV_DEV(netdev, &dev->dev);
+
if ((err = register_netdev(netdev)) != 0) {
printk(KERN_WARNING "%s> register_netdev err=%d\n",
__FUNCTION__, err);
info->backend = backend;
- netif_state = NETIF_STATE_CONNECTED;
-
return 0;
abort_transaction:
static void __init init_net_xenbus(void)
{
- xenbus_register_device(&netfront);
-}
-
-static int wait_for_netif(void)
-{
- int err = 0;
- int i;
-
- /*
- * We should figure out how many and which devices we need to
- * proceed and only wait for those. For now, continue once the
- * first device is around.
- */
- for ( i=0; netif_state != NETIF_STATE_CONNECTED && (i < 10*HZ); i++ )
- {
- set_current_state(TASK_INTERRUPTIBLE);
- schedule_timeout(1);
- }
-
- if (netif_state != NETIF_STATE_CONNECTED) {
- WPRINTK("Timeout connecting to device!\n");
- err = -ENOSYS;
- }
- return err;
+ xenbus_register_driver(&netfront);
}
static int __init netif_init(void)
init_net_xenbus();
- wait_for_netif();
-
return err;
}
static void __init init_tpm_xenbus(void)
{
- xenbus_register_device(&tpmfront);
+ xenbus_register_driver(&tpmfront);
}
return drv->remove(dev);
}
-static int xenbus_register_driver(struct xenbus_driver *drv,
- struct xen_bus_type *bus)
+static int xenbus_register_driver_common(struct xenbus_driver *drv,
+ struct xen_bus_type *bus)
{
int err;
return err;
}
-int xenbus_register_device(struct xenbus_driver *drv)
+int xenbus_register_driver(struct xenbus_driver *drv)
{
- return xenbus_register_driver(drv, &xenbus_frontend);
+ return xenbus_register_driver_common(drv, &xenbus_frontend);
}
-EXPORT_SYMBOL(xenbus_register_device);
+EXPORT_SYMBOL(xenbus_register_driver);
int xenbus_register_backend(struct xenbus_driver *drv)
{
- return xenbus_register_driver(drv, &xenbus_backend);
+ return xenbus_register_driver_common(drv, &xenbus_backend);
}
void xenbus_unregister_driver(struct xenbus_driver *drv)
driver_unregister(&drv->driver);
up(&xenbus_lock);
}
+EXPORT_SYMBOL(xenbus_unregister_driver);
struct xb_find_info
{
return p;
}
+static ssize_t xendev_show_nodename(struct device *dev, char *buf)
+{
+ return sprintf(buf, "%s\n", to_xenbus_device(dev)->nodename);
+}
+DEVICE_ATTR(nodename, S_IRUSR | S_IRGRP | S_IROTH, xendev_show_nodename, NULL);
+
+static ssize_t xendev_show_devtype(struct device *dev, char *buf)
+{
+ return sprintf(buf, "%s\n", to_xenbus_device(dev)->devicetype);
+}
+DEVICE_ATTR(devtype, S_IRUSR | S_IRGRP | S_IROTH, xendev_show_devtype, NULL);
+
static int xenbus_probe_node(struct xen_bus_type *bus,
const char *type,
const char *nodename)
printk("XENBUS: Registering %s device %s: error %i\n",
bus->bus.name, xendev->dev.bus_id, err);
kfree(xendev);
+ } else {
+ device_create_file(&xendev->dev, &dev_attr_nodename);
+ device_create_file(&xendev->dev, &dev_attr_devtype);
}
return err;
}
return container_of(drv, struct xenbus_driver, driver);
}
-int xenbus_register_device(struct xenbus_driver *drv);
+int xenbus_register_driver(struct xenbus_driver *drv);
int xenbus_register_backend(struct xenbus_driver *drv);
void xenbus_unregister_driver(struct xenbus_driver *drv);